class SentenceInstance:  # 某个句子加上一个 plus_text 的所有的原始信息都存储在这里
    def __init__(self, sentence_text: str, origin_triplets: list, tokenizer, max_length, plus_text):
        self.sentence_text = sentence_text
        self.origin_triplets = origin_triplets
        self.plus_text = plus_text
        self.sentence_token = tokenizer.encode(self.sentence_text)[1:-1]
        self.plus_text_token = tokenizer.encode(self.plus_text)[1:-1]

        def get_word_token_range() -> list:
            # 为什么要这么复杂，这是因为直接使用 split 会得到类似 "world!" 这样字符串加上标点的表达，
            # 但是实际上 bert tokenizer 会把这个解析成 [3434, 999] 两份
            token_range, token_start = [], 0
            for i, word_text in enumerate(self.sentence_text.strip().split()):
                token_end = token_start + len(tokenizer.encode(word_text, add_special_tokens=False))
                token_range.append([token_start, token_end - 1])
                token_start = token_end
            return token_range

        self.word_token_range = get_word_token_range()  # 关于这个部分的代码，具体可以看 test03.py 中的测试
        # self.word_token_range 形如 [[0, 0], [1, 1], [1, 2], [3, 4]]

        self.triplets = []
        for aspect_span, opinion_span_list, sentiment_id in origin_triplets:
            triplet_dict = {"aspect_span": [], "opinion_span_list": [], 'sentiment': 0}
            triplet_dict["aspect_span"].append(self.word_token_range[aspect_span[0]][0])
            triplet_dict["aspect_span"].append(self.word_token_range[aspect_span[-1]][1])
            # 接下来是把 text 中的 aspect 和 opinion 的位置转化成在 token 中的位置
            for opinion_span in opinion_span_list:
                triplet_dict["opinion_span_list"].append([
                    self.word_token_range[opinion_span[0]][0],
                    self.word_token_range[opinion_span[-1]][1]
                ])
                pass
            triplet_dict['sentiment'] = sentiment_id
            self.triplets.append(triplet_dict)
            pass
        pass

    pass
